package com.bt.lms.ui.page.sys.major;

import com.alibaba.fastjson.JSONObject;
import com.bt.lms.constants.BOConstant;
import com.bt.lms.entity.Major;
import com.bt.lms.entity.page.Page;
import com.bt.lms.ui.page.sys.major.action.*;
import com.bt.lms.ui.page.sys.style.LabStyle;
import com.bt.lms.ui.page.sys.utils.MyButton;
import com.bt.lms.ui.page.sys.vo.MajorInfoVo;
import com.bt.lms.ui.page.sys.vo.MajorTableVo;
import com.bt.lms.ui.vo.PageSkipInfo;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.util.Callback;
import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

/**
 * 专业列表
 *
 * @author 徐大永
 */
public class MajorTableView extends TableView<MajorInfoVo> {

    /**
     * 分页模型
     */
    private final Page<Major> page;

    /**
     * 界面跳转信息
     */
    private final PageSkipInfo pageSkipInfo;

    /**
     * 构建列表
     *
     * @param inPane       所在一级容器
     * @param page    分页模型
     * @param pageSkipInfo 界面跳转信息
     */
    public MajorTableView(Pane inPane, Page<Major> page, PageSkipInfo pageSkipInfo) {

        //维护
        this.page = page;
        this.pageSkipInfo = pageSkipInfo;

        //列表
        //1.列头
        TableColumn<MajorInfoVo, String> idTC = new TableColumn<>("学科/专业编码");
        TableColumn<MajorInfoVo, String> nameTC = new TableColumn<>("学科/专业名称");
        TableColumn<MajorInfoVo, Integer> statusTC = new TableColumn<>("状态");
        TableColumn<MajorInfoVo, MajorTableVo> operateTC = new TableColumn<>("操作");

        //1.2 列头添加到视图
        this.getColumns().addAll(idTC, nameTC, statusTC, operateTC);

        //2.数据初始化
        List<MajorInfoVo> dataS = dataInit();
        //2.2 格式转化(用户数据集合转换成Javafx组件集合)
        ObservableList<MajorInfoVo> users = FXCollections.observableArrayList(dataS);
        //2.3 数据添加到表格
        this.setItems(users);

        //3.映射（让每一列知道要展示的属性是哪一个）
        idTC.setCellValueFactory(new PropertyValueFactory<>("code"));
        nameTC.setCellValueFactory(new PropertyValueFactory<>("name"));
        statusTC.setCellValueFactory(new PropertyValueFactory<>("status"));
        operateTC.setCellValueFactory(new PropertyValueFactory<>("majorTableVo"));

        //自定义渲染
        customVRay(statusTC, operateTC);
    }


    /**
     * 数据初始化
     *
     * @return 处理好的数据集
     */
    private List<MajorInfoVo> dataInit() {

        //数据总集合
        List<MajorInfoVo> roleInfoVos = new ArrayList<>();

        List<Major> records = page.getRecords();

        for (Object record : records) {
            try {
                //解JSON
                JSONObject roleJSON = (JSONObject) record;
                MajorInfoVo majorInfoVo = roleJSON.toJavaObject(MajorInfoVo.class);
                MajorTableVo majorTableVo = new MajorTableVo();
                BeanUtils.copyProperties(majorTableVo, majorInfoVo);
                majorInfoVo.setMajorTableVo(majorTableVo);
                //对象维护 用户操作视图对象
                roleInfoVos.add(majorInfoVo);
            } catch (IllegalAccessException | InvocationTargetException e) {
                throw new RuntimeException(e);
            }
        }

        //返回全部数据
        return roleInfoVos;
    }

    /**
     * 操作按钮盒子初始化
     *
     * @param majorTableVo 专业列表信息
     * @return 操作按钮盒子
     */
    private HBox operateHBoxInit(MajorTableVo majorTableVo) {

        //新建操作盒子
        HBox operateHBox = new HBox();
        operateHBox.setPadding(new Insets(2));
        operateHBox.setSpacing(10);

        //操作按钮(查看详情
        MyButton detailsBtn = new MyButton("查看详情");
        ObservableList<Node> children = operateHBox.getChildren();
        children.add(detailsBtn);
        //事件
        MLDetailsBtnAction MLDetailsBtnAction = new MLDetailsBtnAction(majorTableVo, pageSkipInfo);
        detailsBtn.setOnAction(MLDetailsBtnAction);

        //操作按钮(编辑
        MyButton compileBtn = new MyButton("编辑");
        ObservableList<Node> compileChildren = operateHBox.getChildren();
        compileChildren.add(compileBtn);
        //事件
        MLCompileBtnAction MLCompileBtnAction = new MLCompileBtnAction(majorTableVo, pageSkipInfo);
        compileBtn.setOnAction(MLCompileBtnAction);

        //操作按钮(启用
        MyButton startBtn = new MyButton("启用");
        operateHBox.getChildren().add(startBtn);
        //事件
        MLStartBtnAction mlStartBtnAction = new MLStartBtnAction(majorTableVo, pageSkipInfo);
        startBtn.setOnAction(mlStartBtnAction);

        //操作按钮(停用
        MyButton stopBtn = new MyButton("停用");
        operateHBox.getChildren().add(stopBtn);
        //事件
        MLStopBtnAction mlStopBtnAction = new MLStopBtnAction(majorTableVo, pageSkipInfo);
        stopBtn.setOnAction(mlStopBtnAction);

        //操作按钮(删除
        MyButton deleteBtn = new MyButton("删除");
        ObservableList<Node> deleteChildren = operateHBox.getChildren();
        deleteChildren.add(deleteBtn);
        //事件
        MLDeleteBtnAction mlDeleteBtnAction = new MLDeleteBtnAction(majorTableVo, pageSkipInfo);
        deleteBtn.setOnAction(mlDeleteBtnAction);

        return operateHBox;
    }

    /**
     * 自定义界面渲染
     *
     * @param statusTC  状态列
     * @param operateTC 操作列
     */
    private void customVRay(TableColumn<MajorInfoVo, Integer> statusTC, TableColumn<MajorInfoVo, MajorTableVo> operateTC) {

        //状态列自定义
        statusTC.setCellFactory(new Callback<TableColumn<MajorInfoVo, Integer>, TableCell<MajorInfoVo, Integer>>() {
            @Override
            public TableCell<MajorInfoVo, Integer> call(TableColumn<MajorInfoVo, Integer> param) {
                return new TableCell<MajorInfoVo, Integer>() {
                    @Override
                    protected void updateItem(Integer item, boolean empty) {
                        super.updateItem(item, empty);
                        if (item != null) {
                            if (item.equals(BOConstant.MAJOR_INFO_STATUS_START)) {
                                Label startLab = new Label("启用");
                                LabStyle.status(startLab, LabStyle.OPEN);
                                setGraphic(startLab);
                            } else if (item.equals(BOConstant.MAJOR_INFO_STATUS_STOP)) {
                                Label stopLab = new Label("停用");
                                LabStyle.status(stopLab, LabStyle.STOP);
                                setGraphic(stopLab);
                            }
                        }
                    }
                };
            }
        });

        //操作列自定义
        operateTC.setCellFactory(new Callback<TableColumn<MajorInfoVo, MajorTableVo>, TableCell<MajorInfoVo, MajorTableVo>>() {
            @Override
            public TableCell<MajorInfoVo, MajorTableVo> call(TableColumn<MajorInfoVo, MajorTableVo> param) {
                return new TableCell<MajorInfoVo, MajorTableVo>() {
                    @Override
                    protected void updateItem(MajorTableVo roleTableViewVo, boolean empty) {
                        //覆盖TableCell的样式更新
                        super.updateItem(roleTableViewVo, empty);
                        if (roleTableViewVo != null) {
                            HBox hBox = operateHBoxInit(roleTableViewVo);
                            setGraphic(hBox);//界面显示
                        }
                    }
                };
            }
        });

    }
}
